package com.ohuang.util_a.task.rxtask;

public class RxTaskObserver<T, R> {
    RxMapTask<T, R> rxMapTask;
    RxTask rxTask;

    private RxTaskObserver<R, Object> child;
    RXTaskCallBack<R> mCallBack;


    RxTaskObserver(RxTask rxTask, RxMapTask<T, R> rxMapTask) {
        this.rxTask = rxTask;
        this.rxMapTask = rxMapTask;
    }

    public void run(T t, RXTaskCallBack<Object> rxTaskCallBack) {
        if (rxTask.isStop()){
            rxTaskCallBack.onFair();
            return;
        }
        rxMapTask.run(t, new RXTaskCallBack<R>() {
            @Override
            public void onSuccess(R r) {
                if (mCallBack !=null){
                      mCallBack.onSuccess(r);
                }
                if (child != null) {
                    child.run(r, rxTaskCallBack);
                } else {
                    rxTaskCallBack.onSuccess(r);
                }

            }

            @Override
            public void onFair() {
                if (mCallBack!=null){
                    mCallBack.onFair();
                }
                rxTaskCallBack.onFair();
            }
        });
    }

    /**
     *  当前childTask回调
     * @param mCallBack
     * @return
     */
    public RxTaskObserver<T, R> setCallBack(RXTaskCallBack<R> mCallBack) {
        this.mCallBack = mCallBack;
        return this;
    }

    public RxTask getRxTask() {
        return rxTask;
    }

    public <U> RxTaskObserver<R, U> map(RxTaskRunnable<R, U> ruRxTaskRunnable) {
        RxTaskObserver<R, U> ruRxTaskObserver = new RxTaskObserver<>(rxTask, new RxMapTask<>(ruRxTaskRunnable,rxTask));
        child = (RxTaskObserver<R, Object>) ruRxTaskObserver;
        return ruRxTaskObserver;
    }

    /**
     *
     * @param timeOut  单次任务超时时间  默认0为不设置超时时间
     * @param maxCount  失败重新执行 ，最大次数  默认次数1
     * @param ruRxTaskRunnable
     * @return
     * @param <U>
     */
    public <U> RxTaskObserver<R, U> map(long timeOut, int maxCount, RxTaskRunnable<R, U> ruRxTaskRunnable) {
        RxTaskObserver<R, U> ruRxTaskObserver = new RxTaskObserver<>(rxTask, new RxMapTask<>(timeOut,maxCount,ruRxTaskRunnable,rxTask));
        child = (RxTaskObserver<R, Object>) ruRxTaskObserver;
        return ruRxTaskObserver;
    }
}
